Skip to main content

ScenarioManagementController

The ScenarioManagementController provides comprehensive scenario and input management with full CRUD operations, enhanced data models, and integrated run management.

Overview

This controller consolidates both scenario and input management into a single controller, providing full CRUD operations for scenarios, input data, and simulation runs. It uses normalized DTOs and provides enhanced functionality compared to the basic ScenarioController.

Data Sources

  • Azure Table Storage:
    • Inputs table for scenario and input data
    • Runs table for run metadata and status
  • Configuration: Dependency injection for table service client
  • No Blob Storage: Focuses on metadata management

Endpoints

Scenario Management

GET /api/scenariomanagement

Retrieves all scenarios.

Response:

  • 200 OK: Returns list of ScenarioDto objects
  • 500 Internal Server Error: Database error

Data Flow:

GET /api/scenariomanagement/{id}

Retrieves a specific scenario by ID.

Path Parameters:

  • id (string): Scenario identifier

Response:

  • 200 OK: Returns ScenarioDto object
  • 404 Not Found: Scenario not found
  • 500 Internal Server Error: Database error

POST /api/scenariomanagement

Creates a new scenario.

Request Body:

{
"name": "string",
"description": "string",
"inputFile": "string",
"parameters": {}
}

Response:

  • 201 Created: Returns created ScenarioDto object
  • 400 Bad Request: Validation error
  • 500 Internal Server Error: Database error

Data Flow:

PUT /api/scenariomanagement/{id}

Updates an existing scenario.

Path Parameters:

  • id (string): Scenario identifier

Request Body:

{
"name": "string",
"description": "string",
"inputFile": "string",
"parameters": {}
}

Response:

  • 200 OK: Returns updated ScenarioDto object
  • 404 Not Found: Scenario not found
  • 400 Bad Request: Validation error
  • 500 Internal Server Error: Database error

DELETE /api/scenariomanagement/{id}

Deletes a scenario.

Path Parameters:

  • id (string): Scenario identifier

Response:

  • 204 No Content: Scenario deleted successfully
  • 404 Not Found: Scenario not found
  • 500 Internal Server Error: Database error

Input Management

GET /api/scenariomanagement/{scenarioId}/inputs

Retrieves all inputs for a specific scenario.

Path Parameters:

  • scenarioId (string): Scenario identifier

Response:

  • 200 OK: Returns list of ScenarioDto objects
  • 500 Internal Server Error: Database error

GET /api/scenariomanagement/{scenarioId}/inputs/{inputId}

Retrieves a specific input for a scenario.

Path Parameters:

  • scenarioId (string): Scenario identifier
  • inputId (string): Input identifier

Response:

  • 200 OK: Returns ScenarioDto object
  • 404 Not Found: Input not found
  • 500 Internal Server Error: Database error

POST /api/scenariomanagement/{scenarioId}/inputs

Creates a new input for a scenario.

Path Parameters:

  • scenarioId (string): Scenario identifier

Request Body:

{
"name": "string",
"type": "string",
"data": {},
"parameters": {}
}

Response:

  • 201 Created: Returns created ScenarioDto object
  • 400 Bad Request: Validation error
  • 500 Internal Server Error: Database error

PUT /api/scenariomanagement/{scenarioId}/inputs/{inputId}

Updates an existing input for a scenario.

Path Parameters:

  • scenarioId (string): Scenario identifier
  • inputId (string): Input identifier

Request Body:

{
"name": "string",
"type": "string",
"data": {},
"parameters": {}
}

Response:

  • 200 OK: Returns updated ScenarioDto object
  • 404 Not Found: Input not found
  • 400 Bad Request: Validation error
  • 500 Internal Server Error: Database error

DELETE /api/scenariomanagement/{scenarioId}/inputs/{inputId}

Deletes an input from a scenario.

Path Parameters:

  • scenarioId (string): Scenario identifier
  • inputId (string): Input identifier

Response:

  • 204 No Content: Input deleted successfully
  • 404 Not Found: Input not found
  • 500 Internal Server Error: Database error

Advanced Operations

GET /api/scenariomanagement/search

Searches scenarios by name or description.

Query Parameters:

  • searchTerm (string): Search term

Response:

  • 200 OK: Returns filtered list of ScenarioDto objects
  • 500 Internal Server Error: Database error

GET /api/scenariomanagement/statistics

Retrieves scenario statistics.

Response:

  • 200 OK: Returns statistics object
  • 500 Internal Server Error: Database error

Statistics Response:

{
"totalScenarios": 25,
"activeScenarios": 20,
"totalInputs": 150,
"averageInputsPerScenario": 6,
"scenariosWithRuns": 15,
"totalRuns": 300
}

GET /api/scenariomanagement/{id}/runs

Retrieves all runs for a specific scenario.

Path Parameters:

  • id (string): Scenario identifier

Response:

  • 200 OK: Returns list of RunDto objects
  • 500 Internal Server Error: Database error

POST /api/scenariomanagement/{id}/run

Creates and starts a new run for a scenario.

Path Parameters:

  • id (string): Scenario identifier

Request Body:

{
"startTime": "2023-11-16T00:00:00-05:00",
"endTime": "2023-11-16T23:59:59-05:00",
"reportingTimeStep": 15
}

Response:

  • 201 Created: Returns created RunDto object
  • 400 Bad Request: Validation error
  • 500 Internal Server Error: Database error

GET /api/scenariomanagement/{scenarioId}/runs/{runId}

Retrieves a specific run for a scenario.

Path Parameters:

  • scenarioId (string): Scenario identifier
  • runId (string): Run identifier

Response:

  • 200 OK: Returns RunDto object
  • 404 Not Found: Run not found
  • 500 Internal Server Error: Database error

Data Models

ScenarioDto

public class ScenarioDto
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string InputFile { get; set; }
public Dictionary<string, object> Parameters { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
public bool IsActive { get; set; }
}

CreateScenarioRequest

public class CreateScenarioRequest
{
[Required]
public string Name { get; set; }

public string Description { get; set; }

[Required]
public string InputFile { get; set; }

public Dictionary<string, object> Parameters { get; set; }
}

UpdateScenarioRequest

public class UpdateScenarioRequest
{
[Required]
public string Name { get; set; }

public string Description { get; set; }

[Required]
public string InputFile { get; set; }

public Dictionary<string, object> Parameters { get; set; }
}

CreateInputRequest

public class CreateInputRequest
{
[Required]
public string Name { get; set; }

[Required]
public string Type { get; set; }

public Dictionary<string, object> Data { get; set; }

public Dictionary<string, object> Parameters { get; set; }
}

Azure Storage Details

Table Storage Schema

Inputs Table:

  • PartitionKey: {scenarioId}
  • RowKey: {inputId}
  • Properties: Name, Type, Data, Parameters, CreatedAt, UpdatedAt, IsActive

Runs Table:

  • PartitionKey: {scenarioId}
  • RowKey: {runId}
  • Properties: Status, StartTime, EndTime, ReportingTimeStep, InputFile, Flow, Flooding, CreatedAt, CompletedAt

Error Handling

  • Validation Errors: Returns 400 with validation details
  • Not Found: Returns 404 for missing entities
  • Database Errors: Returns 500 with error logging
  • Concurrent Access: Handles ETag conflicts
  • Business Logic: Validates scenario-input relationships

Performance Considerations

  • Async Operations: All database operations are async
  • Pagination: Supports large result sets
  • Indexing: Optimized for scenario and input queries
  • Caching: No built-in caching (consider for frequently accessed data)
  • Batch Operations: Efficient bulk operations

Dependencies

  • Azure.Data.Tables
  • SwmmModels.DTOs
  • SwmmModels.Requests
  • SwmmModels.Validators
  • System.ComponentModel.DataAnnotations

Workflow Integration

Scenario Lifecycle

Input Management

Monitoring and Logging

  • Request Logging: All operations are logged
  • Error Tracking: Detailed error information
  • Performance Metrics: Scenario and input statistics
  • Audit Trail: Complete history of changes

Security Considerations

  • Input Validation: All inputs are validated
  • Authorization: Requires proper authentication
  • Data Sanitization: Prevents injection attacks
  • Access Control: Scenario-based access control
  • Data Integrity: Maintains referential integrity

Usage Examples

Create New Scenario:

POST /api/scenariomanagement
{
"name": "Urban Stormwater",
"description": "Urban area stormwater simulation",
"inputFile": "urban.inp",
"parameters": {
"rainfallIntensity": 2.5,
"imperviousness": 0.8
}
}

Add Input to Scenario:

POST /api/scenariomanagement/scenario1/inputs
{
"name": "Rainfall Data",
"type": "rainfall",
"data": {
"timeSeries": [...],
"units": "mm/hr"
}
}

Start Simulation Run:

POST /api/scenariomanagement/scenario1/run
{
"startTime": "2023-11-16T00:00:00-05:00",
"endTime": "2023-11-16T23:59:59-05:00",
"reportingTimeStep": 15
}